package problems.daily.y2021m7;

import java.util.*;

/**
 * @author habitplus
 * @since 2021-07-06 09:26
 */
public class T20210706N1 {
    // 1418. 点菜展示表
    // 给你一个数组 orders，表示客户在餐厅中完成的订单，确切地说，
    // orders[i]=[customerNamei,tableNumberi,foodItemi] ，
    // 其中：
    //      customerNamei 是客户的姓名，
    //      tableNumberi  是客户所在餐桌的桌号，
    //      foodItemi     是客户点的餐品名称。
    // 请你返回该餐厅的 点菜展示表 。
    //      在这张表中，表中第一行为标题，其第一列为餐桌桌号 “Table” ，后面每一列都是按字母顺序排列的餐品名称。
    //      接下来每一行中的项则表示每张餐桌订购的相应餐品数量，第一列应当填对应的桌号，后面依次填写下单的餐品数量。
    // 注意：客户姓名不是点菜展示表的一部分。此外，表中的数据行应该按餐桌桌号升序排列。
    //
    // 提示：
    //      1 <= orders.length <= 5 * 10^4
    //      orders[i].length == 3
    //      1 <= customerNamei.length, foodItemi.length <= 20
    //      customerNamei 和 foodItemi 由大小写英文字母及空格字符 ' ' 组成。
    //      tableNumberi 是 1 到 500 范围内的整数。
    //
    //链接：https://leetcode-cn.com/problems/display-table-of-food-orders-in-a-restaurant
    public List<List<String>> displayTable(List<List<String>> orders) {
        if (orders == null || orders.size() == 0) {
            return new ArrayList<>();
        }
        // 存每张桌子的食物及其对应的数量
        Map<Integer, Map<String, Integer>> tableFoodMap = new HashMap<>();
        // 采用桶排序对点了菜的桌编号进行排序
        boolean[] tableNos = new boolean[501];
        // 对菜品名称进行排序，
        TreeSet<String> foodTreeSet = new TreeSet<>();
        String foodItem;
        int table;
        int foodCnt;
        for (List<String> order : orders) {
            table = Integer.parseInt(order.get(1));
            foodItem = order.get(2);
            tableNos[table] = true;
            foodTreeSet.add(foodItem);
            Map<String, Integer> tmpMap = tableFoodMap.getOrDefault(table, new HashMap<>());
            foodCnt = tmpMap.getOrDefault(foodItem, 0);
            tmpMap.put(foodItem, foodCnt + 1);
            tableFoodMap.put(table, tmpMap);
        }


        String[] foodSortedArr = foodTreeSet.toArray(new String[0]);
        table = tableFoodMap.size();
        int foodLen = foodSortedArr.length;
        List<List<String>> ans = new ArrayList<>(table + 1);
        List<String> rowList = new ArrayList<>(foodLen + 1);
        rowList.add("Table");
        // 转换成有序的数组，便于快速索引
        rowList.addAll(foodTreeSet);
        ans.add(rowList);

        for (int i = 1; i < tableNos.length; i++) {
            if (tableNos[i]) {
                rowList = new ArrayList<>(foodLen + 1);
                rowList.add(String.valueOf(i));
                Map<String, Integer> map = tableFoodMap.get(i);
                for (int j = 0; j < foodLen; j++) {
                    foodCnt = map.getOrDefault(foodSortedArr[j], 0);
                    rowList.add(String.valueOf(foodCnt));
                }
                ans.add(rowList);
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        List<List<String>> list = new ArrayList<>();
        list.add(Arrays.asList("David","3","Ceviche"));
        list.add(Arrays.asList("Corina","10","Beef Burrito"));
        list.add(Arrays.asList("David","3","Fried Chicken"));
        list.add(Arrays.asList("Carla","5","Water"));
        list.add(Arrays.asList("Carla","5","Ceviche"));
        list.add(Arrays.asList("Rous","3","Ceviche"));
        System.out.println(new T20210706N1().displayTable(list));
    }

}
